package com.niu.service.impl;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.niu.dto.EmpDto;
import com.niu.dto.EmpLoginDto;
import com.niu.mapper.EmpMapper;
import com.niu.pojo.Emp;
import com.niu.pojo.MyResult;
import com.niu.pojo.PageBean;
import com.niu.service.EmpService;
import com.niu.utils.MyJwtUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class EmpServiceImpl implements EmpService {

    // 员工持久层属性
    @Autowired
    private EmpMapper empMapper;

    // JWT 工具类属性
    @Autowired
    private MyJwtUtils myJwtUtils;

    // 手动实现分页查询 -- 业务层
    /*@Override
    public PageBean<Emp> getPage(Integer pageNum, Integer pageSize) {
        Integer start = (pageNum - 1) * pageSize;
        List<Emp> emps = empMapper.getPage(start, pageSize);
        Long total = empMapper.getTotal();
        return new PageBean<>(total, emps);
    }*/

    // 插件实现分页查询, 不带条件 -- 业务层
    /*@Override
    public PageBean<Emp> getPage(Integer pageNum, Integer pageSize) {
        // 1. 使用插件进行分页计算
        PageHelper.startPage(pageNum, pageSize);

        // 2. 进行查询
        List<Emp> emps = empMapper.getPage();
        Page<Emp> p = (Page<Emp>) emps;
        return new PageBean<>(p.getTotal(), p.getResult());
    }*/

    // 插件实现分页查询, 带条件 -- 业务层
    @Override
    public PageBean<Emp> getPage(EmpDto empDto) {
        // 1. 使用插件计算分页
        PageHelper.startPage(empDto.getPage(), empDto.getPageSize());
        // 2. 进行条件查询
        List<Emp> emps = empMapper.getPage(empDto);
        // 3. 将结果转成 Page
        Page<Emp> p = (Page<Emp>) emps;

        return new PageBean<>(p.getTotal(), p.getResult());
    }

    // 批量删除员工
    @Override
    public int deleteByIds(Integer[] ids) {
        return empMapper.deleteByIds(ids);
    }

    // 添加员工
    @Override
    public int insertEmp(Emp emp) {
        emp.setPassword("123456");
        emp.setCreateTime(LocalDateTime.now());
        emp.setUpdateTime(LocalDateTime.now());
        return empMapper.insertEmp(emp);
    }

    // 根据id 查询员工
    @Override
    public Emp getById(Integer id) {
        return empMapper.getById(id);
    }

    // 更新员工
    @Override
    public int updateEmp(Emp emp) {
        emp.setUpdateTime(LocalDateTime.now());
        return empMapper.updateEmp(emp);
    }

    // 员工登录
    @Override
    public MyResult<String> login(EmpLoginDto dto) {
        // 业务层进行判断, 登录成功返回令牌, 登录失败返回 null
        Emp emp = empMapper.findUsernameAndPassword(dto);
        if (emp == null){ // 登录失败
            return MyResult.error("NOT_LOGIN");
        }
        // 登录成功, 生成jwt令牌
        // 将员工的id 和姓名作为令牌的载荷, 生成令牌
        Map<String, Object> map = new HashMap<>();
        map.put("id", emp.getId());
        map.put("name", emp.getName());
        String jwt = myJwtUtils.createJWT(map);
        return  MyResult.ok(jwt);
    }

    // 根据部门id 删除员工
    @Override
    @Transactional
    public int deleteByDeptId(Integer deptId) {
        return empMapper.deleteByDeptId(deptId);
    }

}
